#ifndef HYSCRIPT_H
#define HYSCRIPT_H

#include <string>

//#include "hyScript_global.h"
#include <QtCore/qglobal.h>

#if defined(HYSCRIPT_LIBRARY)
#  define HYSCRIPT_EXPORT Q_DECL_EXPORT
#else
#  define HYSCRIPT_EXPORT Q_DECL_IMPORT
#endif

#ifdef __cplusplus

class ICardReader
{
public:
    // INSERT 指令执行此命令 0成功，其他返回错误
    virtual int insert(std::string &str_attr) = 0;
    // 发送二进制指令 0成功 其他返回错误
    virtual int send_hex(const std::string &in, std::string &out) = 0;
    // 更新当前指令执行百分比 每执行完一条指令调一次
    virtual void update_percent(int percent) = 0;
};

class IScript
{
public:
    virtual int add(int a,int b) = 0;
    virtual int sub(int a,int b) = 0;

    // 加载脚本文件 并返回解析结果
    virtual bool load_path(const std::string &script_path, const std::string &cos_path,const std::string &alg_path,const std::string &user_alg_path) = 0;
    // 脚本运行 creader 读卡器对象，id要写入的uid,result 最终执行结果，cos_id real_uid分别为返回的芯片的实际的，成功返回，失败不用管
    virtual void execute(ICardReader *creader, const std::string &uid, bool &result, std::string &cos_id, std::string &real_uid) = 0;

};

class HYSCRIPT_EXPORT HyScript : public IScript
{
public:
    HyScript();

    int add(int a,int b) override;
    int sub(int a,int b) override;

    //加载脚本文件 并返回解析结果
    bool load_path(const std::string &script_path, const std::string &cos_path,const std::string &alg_path,const std::string &user_alg_path) override;
    // 脚本运行 creader 读卡器对象，id要写入的uid,result 最终执行结果，cos_id real_uid分别为返回的芯片的实际的，成功返回，失败不用管
    void execute(ICardReader *creader, const std::string &uid, bool &result, std::string &cos_id, std::string &real_uid) override;
};

// 库对外提供接口
extern "C"
{
#endif

// 创建脚本对象
HYSCRIPT_EXPORT IScript * __stdcall NewScript();
// 销毁脚本对象
HYSCRIPT_EXPORT void __stdcall DeleteScript(IScript *ptr);
//// 创建脚本对象
//HYSCRIPT_EXPORT HyScript *NewScript();
//// 销毁脚本对象
//HYSCRIPT_EXPORT void DeleteScript(HyScript *ptr);

#ifdef __cplusplus
};
#endif

#endif // HYSCRIPT_H
